package com.lhh.jiu.base;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
import java.util.List;
import java.util.Map;

/*
所有的Service接口的基础接口
用到了JDK8的函数式接口注解，仅能包含一个抽象方法
 */
public interface BaseService<E,ID extends Serializable> {
    BaseMapper<E> getRepository();

    //根据主键ID获取对象
    default E get(Integer id){
        return  getRepository().selectById(id);
    }

    //获取所有的列表
    default List<E> getAll(){
        return getRepository().selectList(null);
    }

    //添加一条数据
    default E insert(E entity){
        //插入的返回类型为int，默认返回几条数据，如果插入成功，只需要返回插入的主键就可以
        getRepository().insert(entity);
        return entity;
    }

    //修改一条记录
    default E update(E entity){
        getRepository().updateById(entity);
        return entity;
    }

    //添加或更新操作
    default E insertOrUpdate(E entity){
        try {
            Object id = entity.getClass().getMethod("getId").invoke(entity);
            //根据id是否存在，来判断是否进行插入操作还是修改操作
            if(id==null){
                insert(entity);
            }else {
                update(entity);
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return entity;
    }

    //根据主键id删除一条记录
    default int delete(Integer id){
        return getRepository().deleteById(id);
    }

    //批量删除
    default void batchDelete(List<ID> ids){
        getRepository().deleteBatchIds(ids);
    }

    //分页查询
    default Page<E> findAll(Page<E> page){
        return getRepository().selectPage(page,null);
    }

    //获得查询器
    QueryWrapper<E> getQueryWrapper(E e);

    //带参数的查询器
    QueryWrapper<E> getQueryWrapper(Map<String ,Object> condition);

    //根据查询条件分页查询
    default Page<E> findAll(Page<E> page,E e){
        QueryWrapper<E> queryWrapper = getQueryWrapper(e);
        return getRepository().selectPage(page,queryWrapper);
    }

    //根据查询条件分页查询
    default Page<E> findAll(Page<E> page,Map<String,Object> condition){
        QueryWrapper<E> queryWrapper = getQueryWrapper(condition);
        return getRepository().selectPage(page,queryWrapper);
    }

}
